package com.ruoyi.system.mapper;

import java.util.List;
import com.ruoyi.system.domain.TopicChangeRequest;
import org.apache.ibatis.annotations.Param;

/**
 * 选题变更申请Mapper接口
 *
 * @author ltr
 * @date 2024-11-16
 */
public interface TopicChangeRequestMapper
{
    /**
     * 查询选题变更申请
     *
     * @param requestId 选题变更申请主键
     * @return 选题变更申请
     */
    public TopicChangeRequest selectTopicChangeRequestByRequestId(Long requestId);

    /**
     * 查询选题变更申请列表（管理员使用）
     *
     * @param topicChangeRequest 选题变更申请
     * @return 选题变更申请集合
     */
    public List<TopicChangeRequest> selectTopicChangeRequestList(TopicChangeRequest topicChangeRequest);

    /**
     * 查询学生的变更申请列表
     *
     * @param studentId 学生ID
     * @return 选题变更申请集合
     */
    public List<TopicChangeRequest> selectChangeRequestListByStudentId(Long studentId);

    /**
     * 查询原教师需要审核的变更申请列表
     *
     * @param teacherId 教师ID
     * @return 选题变更申请集合
     */
    public List<TopicChangeRequest> selectPendingRequestsForOldTeacher(Long teacherId);

    /**
     * 查询新教师需要审核的变更申请列表
     *
     * @param teacherId 教师ID
     * @return 选题变更申请集合
     */
    public List<TopicChangeRequest> selectPendingRequestsForNewTeacher(Long teacherId);

    /**
     * 查询教师相关的所有变更申请列表（作为原教师或新教师）
     *
     * @param teacherId 教师ID
     * @return 选题变更申请集合
     */
    public List<TopicChangeRequest> selectChangeRequestListByTeacherId(Long teacherId);

    /**
     * 检查学生是否有待处理的变更申请
     *
     * @param studentId 学生ID
     * @return 待处理的变更申请数量
     */
    public int checkStudentPendingRequest(Long studentId);

    /**
     * 检查申请是否属于指定学生
     *
     * @param requestId 申请ID
     * @param studentId 学生ID
     * @return 结果
     */
    public int checkRequestOwner(@Param("requestId") Long requestId,
                                 @Param("studentId") Long studentId);

    /**
     * 检查申请的原教师是否为指定教师
     *
     * @param requestId 申请ID
     * @param teacherId 教师ID
     * @return 结果
     */
    public int checkRequestOldTeacher(@Param("requestId") Long requestId,
                                      @Param("teacherId") Long teacherId);

    /**
     * 检查申请的新教师是否为指定教师
     *
     * @param requestId 申请ID
     * @param teacherId 教师ID
     * @return 结果
     */
    public int checkRequestNewTeacher(@Param("requestId") Long requestId,
                                      @Param("teacherId") Long teacherId);

    /**
     * 新增选题变更申请
     *
     * @param topicChangeRequest 选题变更申请
     * @return 结果
     */
    public int insertTopicChangeRequest(TopicChangeRequest topicChangeRequest);

    /**
     * 修改选题变更申请
     *
     * @param topicChangeRequest 选题变更申请
     * @return 结果
     */
    public int updateTopicChangeRequest(TopicChangeRequest topicChangeRequest);

    /**
     * 删除选题变更申请
     *
     * @param requestId 选题变更申请主键
     * @return 结果
     */
    public int deleteTopicChangeRequestByRequestId(Long requestId);

    /**
     * 批量删除选题变更申请
     *
     * @param requestIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteTopicChangeRequestByRequestIds(Long[] requestIds);

    /**
     * 原教师审核变更申请
     *
     * @param requestId 申请ID
     * @param opinion 审核意见（同意/拒绝）
     * @param reason 意见说明
     * @return 结果
     */
    public int reviewByOldTeacher(@Param("requestId") Long requestId,
                                  @Param("opinion") String opinion,
                                  @Param("reason") String reason);

    /**
     * 新教师审核变更申请
     *
     * @param requestId 申请ID
     * @param opinion 审核意见（同意/拒绝）
     * @param reason 意见说明
     * @return 结果
     */
    public int reviewByNewTeacher(@Param("requestId") Long requestId,
                                  @Param("opinion") String opinion,
                                  @Param("reason") String reason);

    /**
     * 更新变更申请的最终状态
     *
     * @param requestId 申请ID
     * @param finalStatus 最终状态
     * @return 结果
     */
    public int updateFinalStatus(@Param("requestId") Long requestId,
                                 @Param("finalStatus") String finalStatus);

    /**
     * 取消变更申请
     *
     * @param requestId 申请ID
     * @return 结果
     */
    public int cancelChangeRequest(Long requestId);
}